package com.wanghaicheng.util;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.PdfWriter;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.docx4j.Docx4J;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;

/**
 * com.itextpdf.text.Document：这是iText库中最常用的类，它代表了一个pdf实例。如果你需要从零开始生成一个PDF文件，你需要使用这个Document类。首先创建（new）该实例，然后打开（open）它，并添加（add）内容，最后关闭（close）该实例，即可生成一个pdf文件。
 * com.itextpdf.text.Paragraph：表示一个缩进的文本段落，在段落中，你可以设置对齐方式，缩进，段落前后间隔等。
 * com.itextpdf.text.Chapter：表示PDF的一个章节，他通过一个Paragraph类型的标题和整形章数创建。
 * com.itextpdf.text.Font：这个类包含了所有规范好的字体，包括family of font，大小，样式和颜色，所有这些字体都被声明为静态常量。
 * com.itextpdf.text.List：表示一个列表；
 * com.itextpdf.text.pdf.PDFPTable：表示一个表格；
 * com.itextpdf.text.Anchor：表示一个锚，类似于HTML页面的链接。
 * com.itextpdf.text.pdf.PdfWriter：当这个PdfWriter被添加到PdfDocument后，所有添加到Document的内容将会写入到与文件或网络关联的输出流中。
 * com.itextpdf.text.pdf.PdfReader：用于读取PDF文件；
 */
public class PdfUtil implements Office {
    public static Document create() {
        Document document = new Document();
        document.open();
        return document;
    }

    public static PdfWriter create(String absolutePath) {
        Document document = new Document();
        document.open();
        try {
            return PdfWriter.getInstance(document, new FileOutputStream(absolutePath));
        } catch (DocumentException | FileNotFoundException e) {
            e.printStackTrace();
            throw new RuntimeException("创建失败");
        }
    }

    public static void write(Document document, String absolutePath) {
        try {
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(absolutePath));
            writer.close();
        } catch (DocumentException | FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    /**
     * docx 转 pdf
     *
     * @param docxPath docx文件
     * @param pdfPath  pdf文件
     * @throws Docx4JException       转换异常
     * @throws FileNotFoundException 文件不存在
     */
    public static void convert(String docxPath, String pdfPath) throws Docx4JException, FileNotFoundException {
        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(docxPath));
        Docx4J.toPDF(wordMLPackage, new FileOutputStream(pdfPath));
    }

    /**
     * pdf 转 png
     *
     * @param pdf     pdf文件
     * @param pngFile png文件
     */
    public static void toPng(String pdf, OutputStream pngFile) {
        try (PDDocument document = PDDocument.load(new File(pdf))) {
            PDFRenderer renderer = new PDFRenderer(document);
            document.getPage(0);
            BufferedImage image = renderer.renderImageWithDPI(0, 150);
            ImageIO.write(image, "PNG", pngFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
